import copy


def use_list_copy(list):
    """
    列表内置的copy，属于浅copy
    """
    print(f'原list内容为：{list}')
    new_list = list
    list_copy = list.copy()
    new_list[0] = '改变'  # 直接赋值，赋值列表改变，源列表也改变
    list_copy[1] = '改变'  # 列表自带copy，copy列表改变，源列表不变
    print(f'现在list的内容为：{list}')
    print(f'new_list内容为{new_list}')
    print(f'list_copy内容为：{list_copy}')


def use_copy(list):
    """
    copy库内的copy函数
    """
    copy_list = copy.copy(list)
    copy_list[0] = '改变'
    print(f'list的地址{id(list)}')
    print(f'copy_list的地址{id(copy_list)}')  # 使用copy后地址与原列表不同
    print(f'list的内容：{list}')
    print(f'copy_list的内容：{copy_list}')  # copy_list变化不会引起list变化


def use_copy_difference(list1, list2):
    """
    浅copy，只做第一层copy
    """
    list = [list1, list2]
    copy_list = copy.copy(list)
    print(f'list的地址是：{id(list)}')
    print(f'copy_list的地址是：{id(copy_list)}')
    copy_list[0][0] = '改变'
    copy_list[-1][-1] = '改变'
    print(f'list内容为：{list}')  # 外层地址不同
    print(f'copy_list内容为：{copy_list}')
    print(f'list[0]的地址为：{id(list[0])}')  # 内层的地址相同，copy改变，原列表也改变
    print(f'copy_list[0]的地址为：{id(copy_list[0])}')


class Student:
    def __init__(self, age, classes):
        self.age = age
        self.classes = classes
        self.book = ['语文', '英语']


def use_deep_copy(Student: Student):
    """
    深copy：递归的进行copy
    可变数据类型中镶嵌了可变数据类型
    """
    new_student = copy.deepcopy(Student)
    new_student.age = 20
    new_student.book.append('数学')
    print(f'原Student的age为:{Student.age}')
    print(f'new_Student的age为:{new_student.age}')
    print(f'原Student的book为:{Student.book}')
    print(f'new_Student的book为:{new_student.book}')


if __name__ == '__main__':
    demo_list1 = [1, 2, 3, 4, 5]
    use_list_copy((demo_list1))
    print('-' * 50)
    demo_list2 = [1, 2, 3, 4, 5]
    use_copy(demo_list2)
    print('-' * 50)
    demo_list3 = [1, 2, 3, 4]
    demo_list4 = [5, 6, 7, 8]
    use_copy_difference(demo_list3, demo_list4)
    print('-' * 50)
    xiaoming = Student(18, '高三二班')
    use_deep_copy(xiaoming)
